package com.pd.backend.domain;

import com.pd.backend.entity.PdCoreOrgTree;

import java.util.ArrayList;
import java.util.List;

/**
 * 组织(部门)树结构
 * @Auther : 菜鸡编程
 * @Date:2023/1/12
 * @Description:
 * @VERSON:1.8
 */
public class PdCoreOrgTreeBuild {

    /**
     * 存储树结构的所有数据
     */
    public List<PdCoreOrgTree> pdCoreOrgTreeList = new ArrayList<>();

    /**
     * 构造方法
     * @param
     */
    public PdCoreOrgTreeBuild(List<PdCoreOrgTree> pdCoreOrgTreeList) {
        this.pdCoreOrgTreeList = pdCoreOrgTreeList;
    }

    /**
     *  获取需构建的所有根节点
     * @return
     */
    public List<PdCoreOrgTree> getRootNode(){

        /**
         * 保存所有的根节点
         */
        List<PdCoreOrgTree> rootCodeList = new ArrayList<>();

        /**
         * for循环判断rootCode是否为根节点
         */
        for (PdCoreOrgTree rootCode : pdCoreOrgTreeList) {

            if (rootCode.getTreePath().equals("0")) {
                //rootCode为0 是根节点 添加到集合
                rootCodeList.add(rootCode);
            }
        }
        return rootCodeList;
    }


    /**
     * 根据根节点构建树结构
     * @return
     */
    public List<PdCoreOrgTree> buildTree(){

        /**
         * pdCoreOrgTrees为根节点构建的树结构
         */
        List<PdCoreOrgTree> pdCoreOrgTrees = new ArrayList<>();

        /**
         * getRootNode():获取需构建的所有根节点(上方)
         */
        for (PdCoreOrgTree pdCoreOrgTree : getRootNode()) {
            //用根节点构建子树(方法下方)
            pdCoreOrgTree = buildChildTree(pdCoreOrgTree);
            //添加到树结构集合
            pdCoreOrgTrees.add(pdCoreOrgTree);
        }
        return pdCoreOrgTrees;
    }


    /**
     * 递归-构建子树
     * @param pdCoreOrgTree
     * @return
     */
    public PdCoreOrgTree buildChildTree(PdCoreOrgTree pdCoreOrgTree){
        List<PdCoreOrgTree> childTree = new ArrayList<>();
        // pdCoreOrgTreeList：所有节点集合（所有数据）
        for (PdCoreOrgTree treeList : pdCoreOrgTreeList) {
            // 判断当前节点的父节点ID是否等于根节点的ID，即当前节点为其下的子节点
            if (treeList.getParentId()==pdCoreOrgTree.getId()) {
                // 再递归进行判断当前节点的情况，调用自身方法
                childTree.add(buildChildTree(treeList));
            }
        }
        // for循环结束，即节点下没有任何节点，树形构建结束，设置树结果
        pdCoreOrgTree.setChildren(childTree);
        return pdCoreOrgTree;
    }

}
